<?php
namespace common\modules\user\frontend\models;

use common\commands\command\SendEmailCommand;
use common\modules\user\models\User;
use Yii;
use yii\base\Model;

/**
 * Password reset request form
 */
class PasswordResetRequestForm extends Model
{

    public $email;

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [
                'email',
                'filter',
                'filter' => 'trim'
            ],
            [
                'email',
                'required'
            ],
            [
                'email',
                'email'
            ],
            [
                'email',
                'exist',
                'targetClass' => '\common\models\User',
                'filter' => [
                    'status' => User::STATUS_ACTIVE
                ],
                'message' => 'There is no user with such email.'
            ]
        ];
    }

    /**
     * Sends an email with a link, for resetting the password.
     *
     * @return boolean whether the email was send
     */
    public function sendEmail()
    {
        /* @var $user User */
        $user = User::findOne([
            'status' => User::STATUS_ACTIVE,
            'email' => $this->email
        ]);
        
        if ($user) {
            $user->generatePasswordResetToken();
            if ($user->save()) {
                return Yii::$app->commandBus->handle(new SendEmailCommand([
                    'from' => [
                        Yii::$app->params['adminEmail'] => Yii::$app->name
                    ],
                    'to' => $this->email,
                    'subject' => Yii::t('frontend', 'Password reset for {name}', [
                        'name' => Yii::$app->name
                    ]),
                    'view' => 'passwordResetToken',
                    'params' => [
                        'user' => $user
                    ]
                ]));
            }
        }
        
        return false;
    }

    public function attributeLabels()
    {
        return [
            'email' => Yii::t('frontend', 'E-mail')
        ];
    }
}
